package com.yequan.leetcode.algorithm.search.BinarySearch.isPerfectSquare_367;

/**
 * //给定一个正整数 num，编写一个函数，如果 num 是一个完全平方数，则返回 True，否则返回 False。
 * //
 * // 说明：不要使用任何内置的库函数，如 sqrt。
 * //
 * // 示例 1：
 * //
 * // 输入：16
 * //输出：True
 * //
 * // 示例 2：
 * //
 * // 输入：14
 * //输出：False
 * //
 * // Related Topics 数学 二分查找
 *
 * @author : Administrator
 * @date : 2020/4/5
 */
public class IsPerfectSquare {

    public static void main(String[] args) {
        IsPerfectSquare isPerfectSquare = new IsPerfectSquare();
        boolean res = isPerfectSquare.isPerfectSquare2(14);
        System.out.println(res);
    }

    /**
     * 二分法
     *
     * @param num
     * @return
     */
    public boolean isPerfectSquare1(int num) {
        if (num < 2) {
            return true;
        }
        long left = 1;
        long right = num / 2;
        while (left <= right) {
            long mid = left + ((right - left) >> 2);
            if (mid * mid == num) {
                return true;
            } else if (mid * mid > num) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return false;
    }

    /**
     * 牛顿迭代法
     *
     * @param num
     * @return
     */
    public boolean isPerfectSquare2(int num) {
        long sqrt = num;
        while (sqrt * sqrt > num) {
            sqrt = (sqrt + (num / sqrt)) / 2;
        }
        return (sqrt * sqrt) == num;
    }

}
